package com.sxu.fighting.day1;

public class Test3 {
    // 双指针
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        int j = 0; // 有效数组的最后一位
        for(int i = 0;i<n;i++){ // 遍历整个数组
            if(nums[i] != nums[j]){
                nums[++j] = nums[i];
            }
        }
        return j+1; // 有效数组长度
    }

    // 通用解法
    public int removeDuplicates2(int[] nums) {
        return process(nums, 1);  // 调用通用处理方法，k=1 表示完全去重
    }

    // 通用处理函数：允许最多保留 k 个重复元素
    int process(int[] nums, int k) {
        int idx = 0;  // 慢指针：指向下一个有效元素的插入位置
        for (int x : nums) {  // 快指针：遍历所有元素
            // 关键判断条件：
            // 1. 前 k 个元素直接保留（idx < k）
            // 2. 后续元素：检查当前元素 x 是否与 idx-k 位置的元素相同
            if (idx < k || nums[idx - k] != x) {
                nums[idx++] = x;  // 保留该元素并移动慢指针
            }
        }
        return idx;  // 返回新数组长度
    }
}
